﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
using TestesFixacao.Core.Extensions;
using TestesFixacao.Dominio.Modelos;
using TestesFixacao.Dominio.Readers;
using TestesFixacao.Dominio.Writers;

namespace TestesFixacao.Dominio.Repositorios
{
    public class RepositorioDisciplina : IRepositorioDisciplina
    {
        private readonly Dictionary<int, Disciplina> _disciplinas = new Dictionary<int, Disciplina>();

        public void Importa(string arquivo)
        {
            if (!File.Exists(arquivo))
                throw new FileNotFoundException("Arquivo não encontrado.");

            XmlTextReader readerRoot = new XmlTextReader(arquivo);

            AlternativaReader alternativaReader = new AlternativaReader();

            QuestaoReader questaoReader = new QuestaoReader(alternativaReader);

            DisciplinaReader disciplinaReader = new DisciplinaReader(questaoReader);

            List<Disciplina> disciplinas = new List<Disciplina>();

            disciplinaReader.Convert(readerRoot, disciplinas);

            foreach (var d in disciplinas)
            {
                _disciplinas.Add(d.Numero, d);
            }
        }

        public void Exporta(string arquivo)
        {
            XmlTextWriter sw = new XmlTextWriter(arquivo, Encoding.UTF8);

            AlternativaWriter alternativaWriter = new AlternativaWriter();

            QuestaoWriter questaoWriter = new QuestaoWriter(alternativaWriter);

            DisciplinaWriter disciplinaWriter = new DisciplinaWriter(questaoWriter);

            var registros = _disciplinas.Values;

            disciplinaWriter.Convert(sw, registros.ToArray());

            sw.Close();
        }

        public void Adiciona(Disciplina d)
        {
            _disciplinas.Add(d.Numero, d);
        }

        public void Edita(Disciplina d)
        {
            _disciplinas[d.Numero] = d;
        }

        public Disciplina SelecionaPorId(int numero)
        {
            return _disciplinas[numero];
        }

        public List<Disciplina> SelecionaTodos()
        {
            return _disciplinas.Values.ToList();
        }

        public void Exclui(Disciplina obj)
        {
            _disciplinas.Remove(obj.Numero);
        }

        private int GetTagCount(string arquivo)
        {
            XmlTextReader reader = new XmlTextReader(arquivo);

            int i = 0;
            while (reader.ReadToFollowing("disciplina"))
                i++;

            return i;
        }
    }
}